package PrototypePattern;

/**
 * 当类属性变化时，Client无需变化
 * 比如加入默认属性时，可不变代码，
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("原型模式克隆对象生成实例");

        Sheep sheep = new Sheep("Tom", 2, "白色");
        //浅拷贝 仅复制引用，即两个引用指向同一个对象
        // Sheep sheep1=sheep;
        //深拷贝：复制对象的内容
//        Sheep sheep1=new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
//        Sheep sheep2=new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());

        //       https://www.cnblogs.com/gudi/p/6403953.html Java 的强引用、弱引用、软引用、虚引用
//        WeakReference<Sheep> weakSheep = new WeakReference(sheep);
        Sheep sheep1 = (Sheep) sheep.clone();//克隆
        //hashcode不一致 说明是不同对象
        System.out.println("对象的hashcode：");
        System.out.println(sheep.hashCode());
        System.out.println(sheep1.hashCode());

        //属性一致
        System.out.println(sheep);
        System.out.println(sheep1);

        //基本数据类型只有八个：
        // 数值型：byte，short，int，long，
        // 浮点型：float，double，
        // 字符型：char，
        // 布尔型：boolean。

        //测试其引用类型的成员变量

//        //java的String是引用类型，也就是说，如果你已经定义了一个String str = “abc”，
//        // 那么，不管你再定义多少变量，只要他等于abc，那么他们的地址就是一样的。
//        // java的内存机制就是这样，当你为一个变量赋值的时候，虚拟机会先在内存中去找，
//        // 有没有这个，如果有，直接引用，如果没有，才会开辟新地址，创建一个新的。
//        System.out.println("测试String浅拷贝 深拷贝");
//        String a = "abc";
//        String b = new String(a);
//        String c = new String(a.getBytes());
//        String d = a + "";
//        String e = "abc";
//        System.out.println("a hashCode=" + a.hashCode()
//                + " b hashCode=" + b.hashCode()
//                + " c hashCode=" + c.hashCode()
//                + " d hashCode=" + d.hashCode()
//                + " e hashCode=" + e.hashCode());


        System.out.println("*************");
        System.out.println("原型模式：深拷贝 实现Cloneable接口+重写clone()");
        DeepCloneSheep deepCloneSheep = new DeepCloneSheep("Jack", 3, "黑色");
        DeepCloneSheep deepCloneSheep1 = (DeepCloneSheep) deepCloneSheep.clone();
        //hashcode不一致 说明是不同对象
        System.out.println("深拷贝 对象的hashcode：");
        System.out.println(deepCloneSheep.hashCode());
        System.out.println(deepCloneSheep1.hashCode());
        //测试其引用类型的成员变量
        



    }
}
